package modelo;

import java.util.HashSet;
import java.util.List;
import java.util.Set;


public class Monje implements Features, Comparable<Monje>{
	
	private String name;
	private Set<Features> featuresSet;
	private int id;
	
	public Monje(String name,int id,List<Features> list){
		this.name=name;
		featuresSet= new HashSet<Features>(list);
		this.id = id;
	}
	
	public String getName(){
		return name;
	}
	
	public int getId() {
		return id;
	}
	
	public String toString(){
		String espacios="";
		for(int i=1;i<=12-name.length();i++) espacios=espacios+" ";
		String orden="";
		String titulo="";
		String cabeza="";
		String vello="";
		String complexion="";
		for(Features f : featuresSet){
			if(f instanceof Features.Orden ) orden=f.toString();
			if(f instanceof Features.Titulo ) titulo= f.toString();
			if(f instanceof Features.Cabeza) cabeza=f.toString();
			if(f instanceof Features.VelloFacial ) vello=f.toString();
			if(f instanceof Features.Cuerpo ) complexion=f.toString();
			
		}
		return id+" "+name;
		//return(name+espacios+orden+", "+titulo+", "+cabeza+", "+vello+", "+complexion);
	}
	
	public Set<Features> getFeaturesSet(){
		return featuresSet;
	}
	
	public boolean is(List<Features> features){
		int cont=0;
		if(features.size()==0) return false;
		for(Features c: features){
			if(featuresSet.contains(c)) cont++;
		}
		if(features.size()==cont)return true;
		else return false;
	}
	
	public boolean is(Features feature){
		return featuresSet.contains(feature);
	}

	@Override
	public int compareTo(Monje paramMonje) {
		
		Features.Orden thisOrden=null, paramOrden=null;
		Features.Titulo thisTitulo=null, paramTitulo=null;
		Features.Cabeza thisCabeza=null, paramCabeza=null;
		Features.VelloFacial thisVello=null, paramVello=null;
		Features.Cuerpo thisCuerpo=null, paramCuerpo=null;
		
		for(Features f : featuresSet){
			if(f instanceof Features.Orden){
				thisOrden=(Features.Orden)f;
			}
			if(f instanceof Features.Titulo){
				thisTitulo=(Features.Titulo)f;
			}
			if(f instanceof Features.Cabeza){
				thisCabeza=(Features.Cabeza)f;
			}
			if(f instanceof Features.VelloFacial){
				thisVello=(Features.VelloFacial)f;
			}
			if(f instanceof Features.Cuerpo){
				thisCuerpo=(Features.Cuerpo)f;
			}
		}
		
		for(Features f : paramMonje.getFeaturesSet()){
			if(f instanceof Features.Orden){
				paramOrden=(Features.Orden)f;
			}
			if(f instanceof Features.Titulo){
				paramTitulo=(Features.Titulo)f;
			}
			if(f instanceof Features.Cabeza){
				paramCabeza=(Features.Cabeza)f;
			}
			if(f instanceof Features.VelloFacial){
				paramVello=(Features.VelloFacial)f;
			}
			if(f instanceof Features.Cuerpo){
				paramCuerpo=(Features.Cuerpo)f;
			}
		}
		// COMPARACIONES ENTRE LOS ATRIBUTOS DE THIS Y EL PARAMETRO
		if(thisOrden.compareTo(paramOrden)==0){
			if(thisTitulo.compareTo(paramTitulo)==0){
				if(thisCabeza.compareTo(paramCabeza)==0){
					if(thisVello.compareTo(paramVello)==0){
						return(thisCuerpo.compareTo(paramCuerpo));
					}
					else return(thisVello.compareTo(paramVello));
				}
				else return thisCabeza.compareTo(paramCabeza);
			}
			else return thisTitulo.compareTo(paramTitulo);
		}
		else return thisOrden.compareTo(paramOrden);
	}
}

